/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package beans;

import general.util.EntitiesValidation;
import general.util.MyPassDataUtil;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import jpa.controller.FornecedorJpaController;
import jpa.controller.NotaJpaController;
import jpa.controller.ProdutoJpaController;
import jpa.entity.Fornecedor;
import jpa.entity.Nota;
import jpa.entity.Produto;
import jpa.entity.Produto_Pedido;
import jpa.entity.Titulo;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.LazyDataModel;
import javax.faces.bean.ViewScoped;
import jpa.controller.BankJpaController;
import jpa.controller.EmpresaJpaController;
import jpa.controller.PedidoJpaController;
import jpa.controller.Produto_PedidoJpaController;
import jpa.controller.TipoPagamentoJpaController;
import jpa.entity.Bank;
import jpa.entity.Empresa;
import jpa.entity.Pedido;
import jpa.entity.TipoPagamento;

/**
 *
 * @author isaias
 */
@ManagedBean
@ViewScoped
public class NotaFiscalBean implements Serializable {

    private String numeroNotaFilter = null;
    private String nameProductFilter=null;
    private Nota nota = new Nota();
    private Nota notaSelected = new Nota();
    private List<Produto_Pedido> produtos_pedido = new ArrayList<Produto_Pedido>();
    private List<Titulo> titulos = new ArrayList<Titulo>();
    private Fornecedor fornecedorSelected = new Fornecedor();
    private Produto_Pedido produto_nota = new Produto_Pedido();
    private Produto_Pedido produto_notaSelected = new Produto_Pedido();
    private Produto produtoSelected = new Produto();
    private LazyDataModel<Produto> lazyProductModel = null;
    private Titulo titulo = new Titulo();
    private List<TipoPagamento> tipoPagamentos = new ArrayList<TipoPagamento>();
    private List<Bank> banks = new ArrayList<Bank>();
    private Titulo tituloSelected = new Titulo();
    private Empresa empresaSelected = new Empresa();
    private String numeroPedidoFilter = null;
    private Pedido pedidoSelected = new Pedido();
    private Double valorTotalNota = 0.0;


    /** Creates a new instance of NotaFiscalBean */
    public NotaFiscalBean() {
         initListFormasPagamento();
         initListBanks();
    }

   /*
    * Buscar pedido por numero e listar os produtos_pedidos
    */
   public List<Produto_Pedido> listProdutos_pedidos(){
      if(pedidoSelected != null &&  !pedidoSelected.getProdutos_pedido().isEmpty()){
            return  pedidoSelected.getProdutos_pedido();
      }else{
            return new ArrayList<Produto_Pedido>();
      }
   }


   public List<String> validateAddTituloNota(Titulo titulo) {
        List<String> erros = new ArrayList<String>();

         if(fornecedorSelected == null){
             erros.add("O campo fornecedor é obrigatorio!");
         }

         if(pedidoSelected == null || pedidoSelected.getObra() == null){
             erros.add("O campo origem é obrigatorio!");
         }

         if(titulo.getTipoPagamento() == null){
             erros.add("Escolha um tipo de pagamento!");
         }

         if(nota.getNumber() == null){
             erros.add("Forneça um numero para o titulo!");
         }

         if(titulo.getVencimento() == null){
             erros.add("Escolha uma data de vencimento!");
         }

         if(titulo.getValor() < 0){
             erros.add("Forneça um valor para o titulo!");
         }

        return erros;
    }

   public void remove(){
       try {
           if(notaSelected != null){
               new NotaJpaController().destroy(notaSelected.getId());
                 FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Nota removida com sucesso!", null);
                FacesContext.getCurrentInstance().addMessage(null, message);
                notaSelected = new Nota();
           }
       } catch (Exception e) {
             FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao tentar remover nota!", null);
                FacesContext.getCurrentInstance().addMessage(null, message);
         e.printStackTrace();
       }
  
                
   }
   

   public void addTituloInList(){
  
        List<String> erros = validateAddTituloNota(titulo);

        if(erros.isEmpty()){
             titulo.setFornecedor(fornecedorSelected);
             titulo.setObra(pedidoSelected.getObra());
             titulo.setNumeroDocumento(nota.getNumber());

            try{
                titulos.add(titulo);
                titulo = new Titulo();
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Titulo adicionado!", null);
                FacesContext.getCurrentInstance().addMessage(null, message);
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }else{
            for(String e : erros){
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, e, null);
                FacesContext.getCurrentInstance().addMessage(null, message);
            }
        }
   }

   public void cauculeValorNotaSelectListener() {
        List<Produto_Pedido> produtos_pedido1 = pedidoSelected.getProdutos_pedido();
        Double valorTotalNota = 0.0;
        int i = 0;
        for(Produto_Pedido p : produtos_pedido1){
            if(p.isIsDelivered()){
              valorTotalNota +=  p.getValorTotal();  
            }
              try {
                    new Produto_PedidoJpaController().edit(p);
                     if(i < 1){
                       FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Alteração salva com sucesso!", null);
                       FacesContext.getCurrentInstance().addMessage(null, message);
                       i++;
                     }
                } catch (Exception e) {
                    e.printStackTrace();
                }
        }
        nota.setValorTotal(valorTotalNota);
   }

    public List<Nota> listNotas(){
        return new NotaJpaController().findNotaForNumber(numeroNotaFilter, MyPassDataUtil.getInstance().getCurrentUser());
    }

    public void selectProductListener(Produto p){
            produtoSelected = p;
    }

    private void initListBanks(){
        banks = new BankJpaController().findBankEntities();
    }

    private void initListFormasPagamento(){
        tipoPagamentos = new TipoPagamentoJpaController().findTipoPagamentoEntities();
    }

    public List<Produto> listProdutos(){
        return new ProdutoJpaController().findProdutoForName(nameProductFilter);
    }

    public void cancelar(){
        produtoSelected = new Produto();
        produto_nota = new Produto_Pedido();
    }

    public void ProdutoSelectListener(SelectEvent event) {

        String name = null;

        if (event.getObject() instanceof String) {
            name = (String) event.getObject();

            produtoSelected = new Produto();

            produtoSelected.setName(name.trim().toUpperCase());

            produtoSelected = new ProdutoJpaController().findProdutoByName(produtoSelected.getName());
           

        } else if (event.getObject() instanceof Produto) {
            produtoSelected = (Produto) event.getObject();
        } else {
            throw new RuntimeException("Erro ao converter produto " + event.getObject().getClass());
        }
            System.out.println(">>>>>>>>>>>> Detalhe do produto: "+ produtoSelected.getDetalhe().getName());
        if (produtoSelected == null) {
            produtoSelected = new Produto();
        }

        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Produto selecionado (" + produtoSelected.getName() + ")", null);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }


    public void fornecedorSelectListener(SelectEvent event) {

        String name = null;

        if (event.getObject() instanceof String) {
            name = (String) event.getObject();
            fornecedorSelected = new Fornecedor();
            
            fornecedorSelected.setName(name.trim().toUpperCase());

           fornecedorSelected = new FornecedorJpaController().findFornecedorForName(fornecedorSelected.getName());
            
        } else if (event.getObject() instanceof Fornecedor) {
            fornecedorSelected = (Fornecedor) event.getObject();
        } else {
            throw new RuntimeException("Erro ao converter fornecedor " + event.getObject().getClass());
        }

        if (fornecedorSelected == null) {
            fornecedorSelected = new Fornecedor();
        }

        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Fornecedor selecionado (" + fornecedorSelected.getName() + ")", null);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    
    public void pedidoSelectListener(SelectEvent event) {

        String number = null;

        if (event.getObject() instanceof String) {
            number = (String) event.getObject();

            pedidoSelected = new Pedido();
            pedidoSelected.setNumber(number.trim());
            pedidoSelected = new PedidoJpaController().findPedidoForNumber(number, MyPassDataUtil.getInstance().getCurrentObra());

        } else if (event.getObject() instanceof Pedido) {
            pedidoSelected = (Pedido) event.getObject();
        } else {
            throw new RuntimeException("Erro ao converter pedido " + event.getObject().getClass());
        }

        if (pedidoSelected == null) {
            pedidoSelected = new Pedido();
        }

        String msn ="";
             if(fornecedorSelected == null | fornecedorSelected.getId() == null){
                 msn = "Você precisa escolher um fornecedor, para poder pesquisar por um pedido!";
                 pedidoSelected = new Pedido();
             }else{
                 if(!fornecedorSelected.equals(pedidoSelected.getFornecedor())){
                     msn = "O fornecedor informado na nota fiscal, não é o mesmo do pedido de compra!";
                      pedidoSelected = new Pedido();
                 }else{
                     msn = null;
                 }
              }
         if(msn != null){
              FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, msn, null);
              FacesContext.getCurrentInstance().addMessage(null, message);
         }
    }


    public void empresaSelectListener(SelectEvent event) {

        String name = null;

        if (event.getObject() instanceof String) {
            name = (String) event.getObject();

            empresaSelected = new Empresa();

            empresaSelected.setName(name.trim().toUpperCase());

           empresaSelected = new EmpresaJpaController().findEmpresaForName(empresaSelected.getName());

        } else if (event.getObject() instanceof Empresa) {
            empresaSelected = (Empresa) event.getObject();
        } else {
            throw new RuntimeException("Erro ao converter empresa " + event.getObject().getClass());
        }

        if (empresaSelected == null) {
            empresaSelected = new Empresa();
        }

        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Empresa selecionada (" + empresaSelected.getName() + ")", null);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    public void save(){
        try {

            nota.setEmpresa(empresaSelected);
            nota.setFornecedor(fornecedorSelected);
            nota.setTitulos(titulos);
            nota.setUser(MyPassDataUtil.getInstance().getCurrentUser());
            nota.setPedido(pedidoSelected);

            List<String> erros = EntitiesValidation.validateNotaFiscal(nota);

             if(erros.isEmpty()){
               new NotaJpaController().create(nota);
               FacesMessage message =  new FacesMessage(FacesMessage.SEVERITY_INFO, "Nota salva com sucesso!", null);
               FacesContext.getCurrentInstance().addMessage(null, message);
               nota = new Nota();
               empresaSelected = new Empresa();
               fornecedorSelected = new Fornecedor();
             }else{
                for(String e : erros){
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, e, null));
                }
             }
        } catch (Exception e) {
            e.printStackTrace();
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao tentar salvar nota!", null));
        }
    }

    public Nota getNota() {
        return nota;
    }

    public void setNota(Nota nota) {
        this.nota = nota;
    }

    public Produto_Pedido getProduto_notaSelected() {
        return produto_notaSelected;
    }

    public void setProduto_notaSelected(Produto_Pedido produto_notaSelected) {
        this.produto_notaSelected = produto_notaSelected;
    }

    public List<Titulo> getTitulos() {
        return titulos;
    }

    public void setTitulos(List<Titulo> titulos) {
        this.titulos = titulos;
    }

    public Fornecedor getFornecedorSelected() {
        return fornecedorSelected;
    }

    public void setFornecedorSelected(Fornecedor fornecedorSelected) {
        this.fornecedorSelected = fornecedorSelected;
    }

    public Produto_Pedido getProduto_nota() {
        return produto_nota;
    }

    public void setProduto_nota(Produto_Pedido produto_nota) {
        this.produto_nota = produto_nota;
    }

    public Produto getProdutoSelected() {
        return produtoSelected;
    }

    public void setProdutoSelected(Produto produtoSelected) {
        this.produtoSelected = produtoSelected;
    }

    public String getNameProductFilter() {
        return nameProductFilter;
    }

    public void setNameProductFilter(String nameProductFilter) {
        this.nameProductFilter = nameProductFilter;
    }

    public LazyDataModel<Produto> getLazyProductModel() {
        return lazyProductModel;
    }

    public void setLazyProductModel(LazyDataModel<Produto> lazyProductModel) {
        this.lazyProductModel = lazyProductModel;
    }

    public Titulo getTitulo() {
        return titulo;
    }

    public void setTitulo(Titulo titulo) {
        this.titulo = titulo;
    }

    public List<TipoPagamento> getTipoPagamentos() {
        return tipoPagamentos;
    }

    public void setTipoPagamentos(List<TipoPagamento> tipoPagamentos) {
        this.tipoPagamentos = tipoPagamentos;
    }

    public List<Bank> getBanks() {
        return banks;
    }

    public void setBanks(List<Bank> banks) {
        this.banks = banks;
    }

    public Titulo getTituloSelected() {
        return tituloSelected;
    }

    public void setTituloSelected(Titulo tituloSelected) {
        this.tituloSelected = tituloSelected;
    }

    public Empresa getEmpresaSelected() {
        return empresaSelected;
    }

    public void setEmpresaSelected(Empresa empresaSelected) {
        this.empresaSelected = empresaSelected;
    }

    public String getNumeroNotaFilter() {
        return numeroNotaFilter;
    }

    public void setNumeroNotaFilter(String numeroNotaFilter) {
        this.numeroNotaFilter = numeroNotaFilter;
    }

    public Nota getNotaSelected() {
        return notaSelected;
    }

    public void setNotaSelected(Nota notaSelected) {
        this.notaSelected = notaSelected;
    }

    public List<Produto_Pedido> getProdutos_pedido() {
        return produtos_pedido;
    }

    public void setProdutos_pedido(List<Produto_Pedido> produtos_pedido) {
        this.produtos_pedido = produtos_pedido;
    }

    public String getNumeroPedidoFilter() {
        return numeroPedidoFilter;
    }

    public void setNumeroPedidoFilter(String numeroPedidoFilter) {
        this.numeroPedidoFilter = numeroPedidoFilter;
    }

    public Pedido getPedidoSelected() {
        return pedidoSelected;
    }

    public void setPedidoSelected(Pedido pedidoSelected) {
        this.pedidoSelected = pedidoSelected;
    }

    public Double getValorTotalNota() {
        return valorTotalNota;
    }

    public void setValorTotalNota(Double valorTotalNota) {
        this.valorTotalNota = valorTotalNota;
    }
    
}
